/*
 * @lc app=leetcode.cn id=90 lang=cpp
 *
 * [90] 子集 II
 */

// @lc code=start
class Solution
{
private:
    vector<vector<int>> res;
    vector<int> path;
    void backtracking(vector<int> &nums, int index, vector<bool> &used)
    {
        //返回条件 因为遍历整个树 其实不需要返回
        res.push_back(path); //加入本身 放前面 为了加入空集
        if (index == nums.size())
        {
            return;
        }
        //为了确保树层是无重复的 提前对nums排序
        for (int i = index; i < nums.size(); i++)
        {
            //还是之前的思路 再写一次
            //在nums[i]==nums[i-1]的前提下
            //used[i-1]==true 说明同一树枝用过nums[i-1]   树枝可以使用重复元素
            //used[i-1]==false 说明同一树层用过nums[i-1]  树层不能使用重复元素
            if (i > 0 && nums[i - 1] == nums[i] && used[i - 1] == false)
            {
                //如果树层重复元素 跳过
                continue;
            }
            path.push_back(nums[i]);
            used[i] = true;
            backtracking(nums, i + 1, used);
            used[i] = false;
            path.pop_back();
        }
    }

public:
    vector<vector<int>> subsetsWithDup(vector<int> &nums)
    {
        //可能出现重复元素 需要去重
        //注意树层和树枝的去重逻辑
        sort(nums.begin(), nums.end());
        vector<bool> used(nums.size(), false); //去重
        backtracking(nums, 0, used);
        return res;
    }
};
// @lc code=end
